package basis.netease.hard;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 7-8 解码异或后的排列
 * 给你一个整数数组 perm ，它是前 n 个正整数（1,2,3,4,5,…,n-1,n 共n个正整数）的排列，且 n 是个奇数 。
 * 它被加密成另一个长度为 n-1 的整数数组 encoded ，满足 encoded[i] = perm[i] XOR perm[i+1]。比方说，如果 perm=[1,3,2] ，那么 encoded=[2,1]。
 * 给你 encoded 数组，请你返回原始数组 perm 。题目保证答案存在且唯一。
 * 提示：
 * n 是奇数。
 * 3 <= n < 10^5
 * encoded.length == n - 1
 * 输入格式:
 * 整数数组encoded，以",”分隔字符串形式作为输入
 * 输出格式:
 * 解码后的原始整数数组perm，以",”分隔字符串形式作为输出
 * 输入样例:
 * 加密后的整数数组encoded：
 * 6,5,4,6
 * 输出样例:
 * 原始数组perm：
 * 2,4,1,5,3
 */
public class Main_8 {

    public static int[] decode(int[] encoded) {
        int n = encoded.length + 1;
        int[] perm = new int[n];
        // 先算出1～n所有值的异或值，0^1^2^...^n（此处数字，表示perm索引值）
        int xorAll = 0;
        for (int i = 1; i <= n; i++) {
            xorAll ^= i;
        }
        // 算出加密后数组中偶数索引位的异或值，1^2^...^n（此处数字，表示perm索引值）
        int xorEven = 0;
        for (int i = 1; i < n - 1; i += 2) {
            xorEven ^= encoded[i];
        }
        // 异或运算具有抵消性质，即任何数与自身异或结果为0，任何数与0异或结果为该数本身。所以根据xorAll ^ xorEven可以算出 perm[0]
        perm[0] = xorAll ^ xorEven;
        for (int i = 0; i < encoded.length; i++) {
            perm[i + 1] = perm[i] ^ encoded[i];
        }
        return perm;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] encoded = Arrays.stream(scanner.nextLine().split(",")).mapToInt(Integer::valueOf).toArray();
        StringBuilder sb = new StringBuilder();
        for (int num : decode(encoded)) {
            sb.append(num + ",");
        }
        System.out.println(sb.substring(0, sb.length() - 1));
    }
}
